#我们要增强show()函数的功能，比如，在函数调用前后自动打印日志，但又不希望修改show()函数的定义，这种在代码运行期间动态增加功能的方式，称之为“装饰器”（Decorator）。

#装饰器就是接收一个函数，再返回一个函数。
def log(func):
    # *args, **kw 表示接收任意参数的调用
    def wrapper(*args, **kw):
        #函数对象有一个__name__属性，可以拿到函数的名字
        print('call %s():' % func.__name__)#这一行是增加的功能
        return func(*args, **kw)  #这里就是在调用show()
    return wrapper

#python的@语法，把decorator置于函数的定义处
@log
def show(msg):
    print('Hello '+msg)

#调用show()函数，不仅会运行show()函数本身，还会在运行前打印一行日志
#个人理解，现在的show()函数，它已被装饰过了。多了一些功能
show('PY')   